#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = '汤小洋'

'''
迭代器iterator：用来访问集合元素的一种方式，可以记住遍历的位置
'''
nums = [3, 12, 54, 4, 8]
it = iter(nums)  # 调用iter()函数创建迭代器（列表、元组、字符串等对象都可用于创建迭代器）
print(type(it))
print(next(it))  # 调用next()函数获取迭代器的下一个元素，迭代器只能往前不能后退
print(next(it))

# 使用for...in循环对迭代器进行遍历
for i in it:
    print(i)
print("---------------------------------------------------")

'''
生成器generator：在循环过程中依次计算获取值的对象（节省空间、效率高）
创建生成器的方式：
    方式1：把一个列表生成式的[]改成()
    方式2：在函数中使用yield关键字，此时该函数变成一个生成器函数
'''
# 方式1：把一个列表生成式的[]改成()
generator = (i for i in range(1, 10))  # 使用小括号表示生成generator，使用中括号表示生成list
print(type(generator))

# 获取生成器的下一个值
print(next(generator))  # 获取时才生成值，效率高，类似于Oracle中的sequence
print(next(generator))
print(next(generator))

# 使用for...in循环对生成器进行遍历（一般都是通过循环来操作）
for i in generator:
    print(i)


#  方式2：在函数中使用yield关键字，此时该函数就变成一个生成器函数
def gen():
    print('one')
    yield 13
    print('two')
    yield 8
    print('three')
    yield 38
    print('four')
    yield 25


# 生成器函数和普通函数的执行流程不一样：
# 1.普通函数是顺序执行，执行到最后一行或遇到return语句时结束
# 2.生成器函数是在每次调用next()时执行，遇到yield语句就返回，下一次调用next()时会从上次返回的yield语句处继续执行
g = gen()  # 执行生成器函数，返回一个生成器
print(type(g))
print(next(g))
print(next(g))

# 使用for...in循环对生成器进行遍历
for i in g:
    print(i)
